package com.android.kotlincoroutinemvvmdemo.view
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Path
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.util.AttributeSet
import com.android.kotlincoroutinemvvmdemo.R

/*
* SetLastPointView
* */

/*
    * PorterDuff作用场景:在原有图像上绘制其他内容

      PorterDuff.Mode为枚举类,一共有16个枚举值:
      1.PorterDuff.Mode.CLEAR
      所绘制不会提交到画布上。
      *
      2.PorterDuff.Mode.SRC
      显示上层绘制图片
      *
      3.PorterDuff.Mode.DST
      显示下层绘制图片
      *
      4.PorterDuff.Mode.SRC_OVER
      正常绘制显示，上下层绘制叠盖。
      *
      5.PorterDuff.Mode.DST_OVER
      上下层都显示。下层居上显示。
      *
      6.PorterDuff.Mode.SRC_IN
      取两层绘制交集。显示上层。
      *
      7.PorterDuff.Mode.DST_IN
      取两层绘制交集。显示下层。
      *
      8.PorterDuff.Mode.SRC_OUT
      取上层绘制非交集部分。
      *
      9.PorterDuff.Mode.DST_OUT
      取下层绘制非交集部分。
      *
      10.PorterDuff.Mode.SRC_ATOP
      取下层非交集部分与上层交集部分
      *
      11.PorterDuff.Mode.DST_ATOP
      取上层非交集部分与下层交集部分
      *
      12.PorterDuff.Mode.XOR
      异或：去除两图层交集部分
      *
      13.PorterDuff.Mode.DARKEN
      取两图层全部区域，交集部分颜色加深
      *
      14.PorterDuff.Mode.LIGHTEN
      取两图层全部，点亮交集部分颜色
      *
      15.PorterDuff.Mode.MULTIPLY
      取两图层交集部分叠加后颜色
      *
      16.PorterDuff.Mode.SCREEN
      取两图层全部区域，交集部分变为透明色
    * */

class SetLastPointView @JvmOverloads constructor(
    context: Context,
    attributeSet: AttributeSet? = null
) : BaseView(context, attributeSet) {

    private val mPaint0 by lazy {
        Paint().apply {
            isAntiAlias = true
            isDither = true
            strokeCap = Paint.Cap.SQUARE
            style = Paint.Style.STROKE
            color = context.resources.getColor(R.color.color_10DC3E)
        }
    }

    private val mPath by lazy {
        Path()
    }

    //private val mPorterMode = PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        setBackgroundColor(context.resources.getColor(R.color.color_F3F3F3))
        canvas?.apply {
            val cx = mWidth.toFloat() / 2
            val cy = mHeight.toFloat() / 2
            save()
            translate(cx, cy)

            mPath.apply {
                reset()
                arcTo(
                    -cx * 6 / 7,
                    -cy * 6 / 7,
                    cx * 6 / 7,
                    cy * 6 / 7,
                    0F,
                    315F,
                    false
                )
                setLastPoint(0F, 0F)
            }
            val mStrokeWidth = (cx / 6).coerceAtLeast(minStrokeWidth)
            mPaint0.strokeWidth = mStrokeWidth
            drawPath(mPath, mPaint0)

//            val saveCount = saveLayer(-cx * 6 / 7,
//                -cy * 6 / 7,
//                cx * 6 / 7,
//                cy * 6 / 7,
//                null)
//            mPath.apply {
//                reset()
//                addRect(
//                    -cx * 6 / 7,
//                    -cy * 6 / 7,
//                    cx * 6 / 7,
//                    cy * 6 / 7,
//                    Path.Direction.CW
//                )
//
//                addRect(
//                    -cx * 6 / 7,
//                    -cy * 6 / 7,
//                    -cx * 1 / 7,
//                    -cy * 1 / 7,
//                    Path.Direction.CCW
//                )
//            }
//
//            mPaint3.xfermode = mPorterMode
//            drawPath(mPath, mPaint3)
//            mPaint3.xfermode = null
//
//            restoreToCount(saveCount)

            restore()
        }
    }
}